iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0

Map

Map 介面是用來存放『鍵值對』 (key-value pair) 對應關係的元素集合, 在加入元素時, 必須指定此元素的 key 及 value 兩項內容, 而且key 的內容不可重複。


map 常用方法:

  • void clear():删除該Map物件中的所有key-value對。
  • boolean containsKey (Object key):查詢Map中是否包含指定的key,如果包含則
    返回true
  • boolean containsValue(Object value):查詢Map中是否包含一個或多個value,如
    果包含則返回true
  • Set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素
    都是Map.Entry(Entry是Map的內部類別)物件。
  • Object get(Object key):返回指定key所對應的value;如果此Map中不包含該
    key,則返回null。
  • boolean isEmpty(:查詢該Map是否為空(即不包含任何key-value對),如果為
    空則返回true。
  • Set keySet():返回該Map中所有key組成的Set集合。
  • Object put(Object key, Object value):添加一個key-value對,如果當前Map中已
    有一個與該key相等的key-value對,則新的key-value對會覆蓋原來的key-value
    對。
  • void putAll(Map m ):將指定Map 中的key-value對複製到本Map 中
  • Object remove(Object key):刪除指定key所對應的key-value對,返回被關路
    所關聯的value,如果該key不存在,則返回null。
  • boolean remove(Obioet Key, object value):通是Java.8新增的方法,刪除指定的
    key 、 value 所對打應的key-value對。如果從該Map中成功地用除該key-value,
    方法返回true,否則返回false。
  • int size():返回該Map裡的key-value對的個數。
  • Collection values() :返回該Map裡所有value租成的Collection

Map 中包括一個內部類別 Entry,該類別封裝了一個key-value 對。Entry 包含如
下三個方法。

  • Object getKey():返回該Entry裡包含的key值。
  • Object getValue():返回該Entry裡包含的value值
  • Object setValue(V value):設置該Entry裡包含的value值,並返回新設置的vale
    值。

Map集合的實作類別

  1. **HashMap -**繼承 AbstractMap 並實作 Map, Cloneable, Serializable介面,HashMap 允許 key 值與元素內容為 null,HashMap 的方法不是宣告為 synchronized,所以在多執行的設計上會有 thread-safe 的問題。
  2. SortedMap - 可根據元素的 key 值來做自然排序(遞增排序),SortedMap 中 key 值不得重複也不得為空值( null ),每一個 SortedMap 的鍵值都會實作Comparable 介面,以判斷是否
    出現重複的鍵值,但元素的內容是可以重複的。
  3. TreeMap - 繼承了 AbstractMap 與實作SortedMap, Cloneable,Serializable 介面,實作了 SortedMap 介面,也是SortedMap 中唯一實作的類別,所以也必須實作出 SortedMap 中所有的方法,基於 red-black tree (紅黑樹)演算法所做的實作。
public class HashMapDemo {
	public static void main(String[] args) {
		HashMap<Integer, String> hm = new HashMap<>();
		hm.put(1, "DD");
		hm.put(3, "KK");
		hm.put(2, "AA");
		hm.put(1, "QQ");
		hm.put(5, "BB");
		System.out.println(hm);
		System.out.println(hm.get(2));//以key取值
		System.out.println(hm.keySet());
		System.out.println(hm.values());
		System.out.println(hm.containsKey(8));
		System.out.println(hm.remove(3));
		System.out.println(hm);
		System.out.println(hm.entrySet());
	}
}

Iterator 迭代器

是 java.util 套件中的另一個介面, 它並不是用來建立集合, 而是用來逐一瀏覽集合中所有元素的一項工具,Collection 類別都有個 iterator() 方法, 以集合物件呼叫此方法可傳回一 Iterator 物件, 我們可用此物件呼叫 Iterator 介面的方法來逐一取得、移除集合中的元素。

Map 型的類別則無 iterator() 方法, 但我們可用 entrySet() 等方法取得代表 Map 物件的集合物件, 再用它建立 Iterator 物件。


  • boolean hasNext():檢查是否有下一個元素,如果被迭代的集合元素還沒有被遍歷完,則返回true。
  • Object next():返回集合裡的下一個元素。
  • void remove():删除集合裡上一次next方法返回的元素
  • void forEachRemaining(Consumer action),這是Java 8為Iterator新增的預設方
    法,該方法可使用Lambda運算式來遍歷集合元素。
public class ListDemo{
	public static void main(String[] args) {
		
		ArrayList<Integer> a01 = new ArrayList<>();
		a01.add(100);
		a01.add(88);
		a01.add(100);
		a01.add(65);
		a01.add(33);
		System.out.println(a01);
		System.out.println(a01.get(0)+50);
		
		a01.add(2, 90);
		System.out.println(a01);
		
		a01.set(2, 11);
		System.out.println(a01);

		System.out.println("--------------------");
		//1)for
		for(int i=0; i<a01.size(); i++) {
			if(a01.get(i)==100) {
				a01.remove(i);
				}
			System.out.print(a01.get(i)+"  ");
			
		}

		System.out.println("\n--------------------");
		//2)for-each
		for(int a:a01) {
//			if(a==11) {
//				a01.remove(11);
//			}
			System.out.print(a+"  ");
		}
		
		System.out.println("\n--------------------");
		//3)Iterator
		Iterator<Integer> r= a01.iterator();
		while(r.hasNext()) {
			Integer i = r.next();
			if(i==11) {
				r.remove();
			}
		}
		System.out.println(a01);
	
	}
}

注意:

  1. Iterator 僅用於遍歷集合,Iterator本身不提供盛裝物件的能力,如果需要建立Iterator 物件,則必須有一個被迭代的集合
  2. 當使用Iterator迭代存取Collection 集合元素時,Collection 集合裡的元素不能改變,只有通過Iterator的remove()方法刪除上一次next()方法返回的集合元素才可以

上一篇
Day 29 集合泛型 II
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言